package com.yaosheng.thread.lock;

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Created by yaosheng on 2021/6/30.
 */
public class TestReadWriteLock {

    static Lock lock = new ReentrantLock ();
    private static int value;

    static ReadWriteLock readWriteLock = new ReentrantReadWriteLock ();
    static Lock readLock = readWriteLock.readLock ();
    static Lock writeLock = readWriteLock.writeLock ();

    private static void read(Lock lock){
        try{
            lock.lock ();
            Thread.sleep (1000);
            System.out.println ("Read over!");
        }catch (InterruptedException e){
            e.printStackTrace ();
        }finally {
            lock.unlock ();
        }
    }

    private static void write(Lock lock,int v){
        try{
            lock.lock ();
            Thread.sleep (1000);
            value = v;
            System.out.println ("Write over!");
        }catch (InterruptedException e){
            e.printStackTrace ();
        }finally {
            lock.unlock ();
        }
    }

    public static void main(String[] args) {

        Runnable readR = () -> read (lock);
        Runnable writeR = () -> write (lock,new Random ().nextInt ());

        for(int i=0;i<18;i++) new Thread (readR).start ();
        for(int i=0;i<2;i++) new Thread (writeR).start ();
    }
}
